package com.demo.study.java.templateTest;


/**
 * 模板方法设计模式
 * <p>
 * 模板方法模式的步骤如下：
 * <p>
 * 在抽象类中定义算法骨架，其中包含了一系列抽象方法和具体方法，具体方法中可能包含一些钩子函数，允许具体实现类重写某些步骤。
 * 在具体实现类中实现抽象方法和钩子函数。
 * 将具体实现类传入抽象类，调用抽象类中定义的模板方法，以便执行算法骨架。
 */

/**
 * 具体来说，模板方法模式包含以下几个角色：
 * <p>
 * 抽象类(Abstract Class)：定义了算法骨架，抽象出了算法中不变的部分，而将可变部分留给具体实现类。
 * 具体实现类(Concrete Class)：实现了抽象类中定义的抽象方法，具体实现了算法的各个步骤。
 * 钩子函数(Hook Method)：在抽象类中定义的钩子函数，用于允许具体实现类按需重写一些算法步骤。
 */

//总结模板方法模式   定义骨架，定义抽象类， 由子类实现抽象类定义的抽象方法
public abstract class CookFood {
    // 算法骨架
    public void cook() {
        prepareIngredients();
        cookIngredients();
        serveFood();
        if (shouldAddSeasoning()) {
            addSeasoning();

        }
    }

    // 准备食材
    protected abstract void prepareIngredients();

    // 烹饪食材
    protected abstract void cookIngredients();

    // 上菜
    protected void serveFood() {
        System.out.println("将食物盛在盘子里，摆在餐桌上。");
    }

    // 添加调料（钩子函数）
    protected boolean shouldAddSeasoning() {
        return true;
    }

    // 添加调料
    protected void addSeasoning() {
        System.out.println("在食物上撒上盐和黑胡椒。");
    }
}